package com.xu.cloud.common.util;

import com.github.pagehelper.PageHelper;
import com.xu.cloud.common.pojo.http.req.PageReq;
import com.xu.cloud.common.pojo.http.resp.PageResp;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * PageHelper分页工具类
 *
 * @author xuguan
 * @since 2024/1/27
 */
public class PageUtil {

    public static final String PAGE_NUM = "pageNum";
    public static final String PAGE_SIZE = "pageSize";

    /**
     * 创建com.github.pagehelper.Page
     */
    public static <E> com.github.pagehelper.Page<E> startPage() {
        return PageHelper.startPage(getPageNum(), getPageSize());
    }

    /**
     * 关闭com.github.pagehelper.Page
     */
    public static <E> void closePage(com.github.pagehelper.Page<E> page) {
        page.close();
    }

    /**
     * 创建com.baomidou.mybatisplus.extension.plugins.pagination.Page
     */
    public static <E> com.baomidou.mybatisplus.extension.plugins.pagination.Page<E> mybatisPlusPage() {
        return new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(getPageNum(), getPageSize());
    }

    public static <E, Resp extends PageResp<E>> Resp githubPageToPageResp(com.github.pagehelper.Page<E> page, Class<Resp> cls) {
        if (page == null) {
            return null;
        }
        final Resp pageResp = BeanUtils.instantiateClass(cls);
        pageResp.setPageSize(page.getPageSize());
        pageResp.setPageNum(page.getPageNum());
        pageResp.setTotal(page.getTotal());
        pageResp.setRecords(page.getResult());

        return pageResp;
    }

    public static <E, Resp extends PageResp<E>> Resp mybatisPlusPageToPageResp(com.baomidou.mybatisplus.core.metadata.IPage<E> page, Class<Resp> cls) {
        if (page == null) {
            return null;
        }
        final Resp pageResp = BeanUtils.instantiateClass(cls);
        pageResp.setPageSize((int) page.getSize());
        pageResp.setPageNum((int) page.getPages());
        pageResp.setTotal(page.getTotal());
        pageResp.setRecords(page.getRecords());

        return pageResp;
    }

    private static int getPageNum() {
        int pageNum = PageReq.defaultPageNum;
        final HttpServletRequest request = HttpServletUtil.currentRequest();
        final String pageNumParameter = request.getParameter(PAGE_NUM);
        if (StringUtils.hasText(pageNumParameter)) {
            pageNum = Integer.parseInt(pageNumParameter);
        }
        return pageNum;
    }

    private static int getPageSize() {
        int pageSize = PageReq.defaultPageSize;
        final HttpServletRequest request = HttpServletUtil.currentRequest();
        final String pageSizeParameter = request.getParameter(PAGE_SIZE);
        if (StringUtils.hasText(pageSizeParameter)) {
            pageSize = Integer.parseInt(pageSizeParameter);
        }
        return pageSize;
    }
}
